package com.smt.take.ui.activity

import android.Manifest
import android.content.pm.PackageManager
import android.graphics.Color
import android.os.Bundle
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.amap.api.location.AMapLocation
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationListener
import com.amap.api.maps2d.AMap
import com.amap.api.maps2d.CameraUpdateFactory
import com.amap.api.maps2d.model.BitmapDescriptorFactory
import com.amap.api.maps2d.model.LatLng
import com.amap.api.maps2d.model.MyLocationStyle
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.core.PoiItem
import com.amap.api.services.poisearch.PoiResult
import com.amap.api.services.poisearch.PoiSearch
import com.smt.take.R
import com.smt.take.ui.adapter.AroundRvAdapter
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_map_location.*
import org.jetbrains.anko.toast
import java.util.ArrayList


class MapLocationActivity : BaseActivity(), AMapLocationListener, PoiSearch.OnPoiSearchListener {

    //初始化地图控制器对象
    lateinit var aMap: AMap

    //声明AMapLocationClient类对象
    private lateinit var mLocationClient: AMapLocationClient

    //自定义的code
    private val WRITE_COARSE_LOCATION_REQUEST_CODE = 10

    private lateinit var myLocationStyle: MyLocationStyle

    private lateinit var adapter: AroundRvAdapter

    override fun onLocationChanged(aMapLocation: AMapLocation?) {
        if (aMapLocation != null) {
            toast(aMapLocation.address)
            // 移动到当前位置
            aMap.moveCamera(
                CameraUpdateFactory.changeLatLng(
                    LatLng(
                        aMapLocation.latitude,
                        aMapLocation.longitude
                    )
                )
            )
            aMap.moveCamera(CameraUpdateFactory.zoomTo(16f))
            doSearchQuery(aMapLocation)
            mLocationClient.stopLocation()
        }
    }

    private fun doSearchQuery(aMapLocation: AMapLocation) {
        //keyWord表示搜索字符串，
        //第二个参数表示POI搜索类型，二者选填其一，选用POI搜索类型时建议填写类型代码，码表可以参考下方（而非文字）
        //cityCode表示POI搜索区域，可以是城市编码也可以是城市名称，也可以传空字符串，空字符串代表全国在全国范围内进行搜索
        //keyWord表示搜索字符串，
        //第二个参数表示POI搜索类型，二者选填其一，选用POI搜索类型时建议填写类型代码，码表可以参考下方（而非文字）
        //cityCode表示POI搜索区域，可以是城市编码也可以是城市名称，也可以传空字符串，空字符串代表全国在全国范围内进行搜索
        val query = PoiSearch.Query("", "", aMapLocation.cityCode)
        // 设置每页最多返回多少条poiitem
        query.pageSize = 10
        //设置查询页码
        query.pageNum = 1

        // 搜索范围
        val poiSearch = PoiSearch(this, query)
        // 绑定位置，500米范围内搜索
        poiSearch.bound =
            PoiSearch.SearchBound(LatLonPoint(aMapLocation.latitude, aMapLocation.longitude), 500)
        poiSearch.setOnPoiSearchListener(this)
        poiSearch.searchPOIAsyn()

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_map_location)
        // 判断设备是否有虚拟按键
        if (checkDeviceHasNavigationBar(this)) {
            llMap.setPadding(0, 0, 0, 48.dp2px())
        }
        initView(savedInstanceState)
        initCheckPermission()
    }

    private fun initView(savedInstanceState: Bundle?) {
        rvAround.layoutManager = LinearLayoutManager(this)
        adapter = AroundRvAdapter(this)
        rvAround.adapter = adapter
        //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState)，创建地图
        mMapView.onCreate(savedInstanceState)
        //初始化地图控制器对象
        aMap = mMapView.map
        initLocationStyle()
    }

    private fun initLocationStyle() {
        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
        // 连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。
        // （1秒1次定位）如果不设置myLocationType，默认也会执行此种模式。
        myLocationStyle = MyLocationStyle()
        //设置连续定位模式下的定位间隔，只在连续定位模式下生效，单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.interval(2000)
        //设置定位蓝点的icon图标方法，需要用到BitmapDescriptor类对象作为参数。
        val bitmap = BitmapDescriptorFactory.fromResource(R.drawable.location)
        //myLocationStyle.myLocationIcon(bitmap)
        ////设置是否显示定位小蓝点，用于满足只想使用定位，不想使用定位小蓝点的场景，设置false以后图面上不再有定位蓝点的概念，但是会持续回调位置信息。
        myLocationStyle.showMyLocation(true)
        //设置定位蓝点精度圆圈的边框颜色的方法。
        myLocationStyle.strokeColor(Color.parseColor("#00000000"))
        //设置定位蓝点精度圆圈的填充颜色的方法。
        myLocationStyle.radiusFillColor(Color.parseColor("#00000000"))
        //设置定位蓝点精度圈的边框宽度的方法。
        myLocationStyle.strokeWidth(0f)
        //设置定位蓝点的Style
        aMap.setMyLocationStyle(myLocationStyle)
        // 设置默认定位按钮是否显示，非必需设置。
        aMap.uiSettings.isMyLocationButtonEnabled = true
        // 设置为true表示启动显示定位蓝点，false表示隐藏定位蓝点并不进行定位，默认是false。
        aMap.isMyLocationEnabled = true
    }

    private fun initCheckPermission() {
        //这里以ACCESS_COARSE_LOCATION为例
        if (ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            //申请WRITE_EXTERNAL_STORAGE权限
            ActivityCompat.requestPermissions(
                this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                WRITE_COARSE_LOCATION_REQUEST_CODE
            )
        } else {
            initLocation()
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户在对话框中点击允许
            initLocation()
        } else {
            finish()
            toast("需要有定位权限才能成功定位")
        }
    }

    private fun initLocation() {
        //初始化定位
        mLocationClient = AMapLocationClient(this)
        //设置定位回调监听
        mLocationClient.setLocationListener(this)
        // 开启定位
        mLocationClient.startLocation()
    }

    override fun onDestroy() {
        super.onDestroy()
        //在activity执行onDestroy时执行mMapView.onDestroy()，销毁地图
        mMapView.onDestroy()
    }

    override fun onResume() {
        super.onResume()
        //在activity执行onResume时执行mMapView.onResume ()，重新绘制加载地图
        mMapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        //在activity执行onPause时执行mMapView.onPause ()，暂停地图的绘制
        mMapView.onPause()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState)，保存地图当前的状态
        mMapView.onSaveInstanceState(outState)
    }

    override fun onPoiSearched(poiResult: PoiResult?, rcode: Int) {
        if (rcode == 1000) {
            if (poiResult != null) {
                val poiItems: ArrayList<PoiItem> = poiResult.pois
                adapter.setPoiItemList(poiItems)
                toast("一共有" + poiItems.size + "个兴趣点")
            }
        }
    }

    override fun onPoiItemSearched(poiItem: PoiItem?, rcode: Int) {

    }
}